package swing;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.RowId;
import java.sql.SQLException;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import dao.EtatInscriptionDAO;

import modele.EtatInscription;

public class TableauEtatsInscription extends JPanel {
	private List<EtatInscription> liste;
	private EtatInscriptionDAO dao;
	private JTable tableau;
	private ModeleDynamiqueEtatInscription modele;
	private JLabel message;
	private JButton boutonAjouter;
	private JButton boutonSupprimer;

	public TableauEtatsInscription() {
		// instancier un nouveau disposeur = BorderLayout
		setLayout(new BorderLayout());
		// instancier un nouveau JLabel nommé message
		message = new JLabel();
		// ajouter message dans la partie Nord du disposeur
		add(message, BorderLayout.NORTH);
		// gestion de l'exception (connexion à la base de données)
		try {
			// instancier un nouveau DAO de la table EtatInscription nommé dao
			dao = new EtatInscriptionDAO();
			// créer une variable représentant la méthode lister de la classe
			liste = dao.lister();
			// instancier un nouvel objet ModeleDynamiqueEtatInscription nommé
			// modele
			modele = new ModeleDynamiqueEtatInscription();
			// créer une variable nommée tableau de type JTable ayant pour
			// attribut modele
			final JTable tableau = new JTable(modele);
			// créer une variable nommée scroll de type JScrollPane ayant pour
			// attribut tableau
			JScrollPane scroll = new JScrollPane(tableau);
			// ajouter scroll dans la partie Centre du disposeur
			add(scroll, BorderLayout.CENTER);
			// créer une variable nommée boutons de type JPanel
			JPanel boutons = new JPanel();
			// créer deux boutons (ajouter et supprimer) et les ajouter au
			// JPanel boutons
			boutonAjouter = new JButton("Ajouter");
			boutonSupprimer = new JButton("Supprimer");
			boutons.add(boutonAjouter);
			boutons.add(boutonSupprimer);
			// ajouter le JPanel boutons dans la partie Sud du disposeur
			add(boutons, BorderLayout.SOUTH);

			// ajouter un écouteur au bouton ajouter qui applique la méthode
			// ajouter() de la classe ModeleDynamiqueEtatInscription
			// et ajoute l'objet créé dans la base de données
			boutonAjouter.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent event) {
					modele.ajouter();					
				}				
			});

			// ajouter un écouteur au bouton supprimer qui applique la méthode
			// supprimer() de la classe ModeleDynamiqueEtatInscription
			// et efface l'objet de la base de données
			boutonSupprimer.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent event) {
					// créer un tableau d'entiers nommé selection retournant les
					// lignes séléctionnées dans la JTable
					int[] selection = tableau.getSelectedRows();

					// pour toutes les lignes sélectionées dans le JTable
					for (int i = selection.length - 1; i >= 0; i--) {
						// gestion des exceptions (suppression des objets de la
						// base de données)
						try {
							// supprime les objets de la sélection de la base de
							// données
							dao.supprimer(liste.get(selection[i]).getId());
							// supprime les lignes sélectionnéees du JTable
							modele.supprimer(selection[i]);
							// renvoie un message qui confirme la suppression
							message.setText("Suppression effectuée");
						} catch (SQLException e) {
							// renvoie un message d'erreur si la suppression
							// n'est pas effectuée
							message.setText(e.getMessage());
						}
					}
				}
			});
		} catch (SQLException exc) {
			// renvoie un message d'erreur si la connexion à la base de données
			// n'est pas effectuée
			message.setText("<html><p>Problème de connexion à la base.<br/>Contactez l'administrateur</p></html>");
		}
	}

	private class ModeleDynamiqueEtatInscription extends AbstractTableModel {

		// crée un tableau de String nommé entetes regroupant les libellés des
		// colonnes du JTable
		private final String[] entetes = { "Id", "Libellé" };

		// constructeur vide de l'objet ModeleDynamiqueEtatInscription
		public ModeleDynamiqueEtatInscription() {
			super();
		}

		// méthode ajouter
		public void ajouter() {
			// ajoute un objet EtatInscription dans le tableau
			liste.add(new EtatInscription());
			// // Notifie aux écouteurs que la ligne sélectionnée a été inserée
			// (???)
			modele.fireTableRowsInserted(liste.size() - 1, liste.size() - 1);
		}

		// méthode supprimer qui prend en argument le numéro de ligne (entier)
		public void supprimer(int rowIndex) {
			// supprime un objet EtatInscription dans le tableau selon son
			// numéro de ligne
			liste.remove(rowIndex);
			// Notifie aux écouteurs que toutes les lignes sélectionnées [1ere
			// ligne, dernière ligne], incluses, ont été effacées (???)
			modele.fireTableRowsDeleted(rowIndex, rowIndex);
		}

		// méthode qui retourne le nombre de colonnes du JTable
		@Override
		public int getColumnCount() {
			return entetes.length;
		}		
		// méthode qui retourne le nombre de lignes du JTable
		@Override
		public int getRowCount() {
			return liste.size();
		}

		// méthode qui retourne le nom des colonnes du JTable
		public String getColumnName(int columnIndex) {
			return entetes[columnIndex];
		}

		// méthode qui permet de retourner la valeur d'une cellule du JTable ???
		@Override
		public Object getValueAt(int rowIndex, int columnIndex) {
			switch (columnIndex) {
			case 0:
				return liste.get(rowIndex).getId();
			case 1:
				return liste.get(rowIndex).getLibelle();
			default:
				return null; // Ne devrait jamais arriver
			}
		}

		// permet d'éditer directement les cellules du JTable
		@Override
		public boolean isCellEditable(int x, int y) {
			return y == 1;
		}

		/** Seul le libelle peut etre change */
		@Override
		public void setValueAt(Object value, int rowIndex, int colIndex) {
			EtatInscription ligne = liste.get(rowIndex);
			if (colIndex == 1) {
				ligne.setLibelle(value.toString());

				if (ligne.getLibelle() == null
						|| ligne.getLibelle().matches("^ *$")) {
					message.setText("Il faut remplir le libellé");
				} else {
					try {
						if (ligne.getId() == 0) {
							dao.inserer(ligne);
							message.setText("Libellé ajouté : "+ligne.getLibelle());
						} else {
							dao.modifier(ligne);
							message.setText("Libellé modifié : "+ligne.getLibelle());
						}
						fireTableRowsUpdated(rowIndex, rowIndex);
						//message.setText("");
					
					} catch (SQLException exc) {
						message.setText(exc.getMessage());
					}
				}
			} else {
				message.setText("Seul le libellé peut être modifié");
			}
		}
	}

}
